'use strict';
/** 背包系统 */
module.exports.run = function(d,s){
    const bs = require("../module/base"), cf = require("../config/" + s.U.gamename), gcf = require("../config/gamelist.json"), itemlist = require("../config/item" + s.U.gamename);
    switch(d[1]){
        case 1:{ //获取背包列表
            for(let k in s.U.bag){
                if(!s.U.bag[k]) s.U.bag[k] = 0;
            }
            d[2] = s.U.bag;
            bs.send(s, d);
            break;
        }case 2:{ //使用道具
            if(!bs.checkParam(["id", "num"], d)) return;
            if(s.U.bag[d[2].id] >= d[2].num){
                this.use([d[2].id,d[2].num], s);
                return;
            }else{
                bs.sendE(4);
            }
            break;
        }case 3:{ //删除道具
            if(!bs.checkParam(["id", "num"], d)) return;
            if(s.U.bag[d[2].id] >= d[2].num){
                this.add([[d[2].id,-d[2].num]], s, null, 14);
            }
            break;
        }case 4:{ //获取宝箱列表
            d[2] = s.U.box;
            bs.send(s, d);
            break;
        }case 5:{ //领取宝箱奖励
            if(!bs.checkParam(["index"], d)) return;
            const bg = require("../config/item" + gcf[s.U.gametp]);
            let bdata = s.U.box;
            if(!bdata[d[2].index]){ //宝箱不存在
                bs.sendE(s, 200);
                return;
            }
            if(bg[bdata[d[2].index][0]].usetime > Date.now() - bdata[d[2].index][1]){ //宝箱未到解锁时间
                let dn = Math.ceil((bg[bdata[d[2].index][0]].usetime - (Date.now() - bdata[d[2].index][1])) / cf.boxdiamond);
                //LOG.info("dn", dn);
                if(s.U.bag[2] >= dn){
                    this.add([[2, -dn]], s, null, 13);
                }else{
                    bs.sendE(s, 201);
                    return;
                }
            }
            this.getitem([bdata[d[2].index][0]], s);
            s.U.box[d[2].index] = null;
            break;
        }case 6:{ //添加解锁宝箱
            if(!bs.checkParam(["id", "index"], d)) return;
            //判断道具
            if(!itemlist[d[2].id].usetime || s.U.bag[d[2].id] < 1) return bs.sendE(s, 4);
            //宝箱位置
            if(d[2].index >= s.U.game.boxnum || s.U.box[d[2].index]) return bs.sendE(s, 5);

            s.U.box[d[2].index] = [d[2].id, Date.now()];
            this.add([[d[2].id, -1]], s, null, 4);
            this.run([3,4], s);
            break;
        }case 7:{ //扭蛋
            //判断道具
            if(!s.U.bag["1016"]){
                return bs.sendE(s, 4);
            }
            this.use([1016,1], s);
            break;
        }
    }
}

/** 服务器使用道具 */
module.exports.use = function(d,s,callback){
    const bs = require("../module/base"), gcf = require("../config/gamelist.json"), bg = require("../config/item" + gcf[s.U.gametp]), gm = require("../config/" + gcf[s.U.gametp]);
    //道具是否能使用
    if(bg[d[0]].use != 1){ 
        bs.sendE(s, 7);
        return;
    }
    //最大使用数量判断
    if(bg[d[0]].maxuse && d[1] > bg[d[0]].maxuse){ 
        bs.sendE(s, 6);
        return;
    }
    //判断使用数量
    let usenum = 1;
    if(bg[d[0]].usenum > 0){
        if(d[1] % bg[d[0]].usenum != 0)
            return bs.sendE(s, 4);
        else
            usenum = bg[d[0]].usenum;
    }
    //使用后获得道具
    for(let i=0;i<d[1];i=i+usenum){
        this.getitem([d[0]],s);
    }
    d[1] = -d[1];
    this.add([d], s, null, 4);
}

/** 服务器增加道具 */
module.exports.add = function(d,s,callback,tp,ext){
    const bs = require("../module/base"), itemlist = require("../config/item" + s.U.gamename), game = require("./game");
    let sqllog = "", rtlist = [];
    ext = ext || 0;
    for(let i=0;i<d.length;i++){
        s.U.bag[d[i][0]] = (s.U.bag[d[i][0]] || 0) + (d[i][1] || 0);
        //判断道具是否不够扣
        if(s.U.bag[d[i][0]] < 0){
            s.U.bag[d[i][0]] = s.U.bag[d[i][0]] - d[i][1];
            return false;
        }
        //检查是否拥有上限
        if(tp != 9 && tp != 1 && tp != 17 && d[i][1] > 0 && (itemlist[d[i][0]].max && s.U.bag[d[i][0]] > itemlist[d[i][0]].max)) s.U.bag[d[i][0]] = itemlist[d[i][0]].max;
        //记录日志
        if(sqllog) sqllog += `,(NOW(),${s.U.uid},${s.U.gametp},${d[i][0]},${d[i][1]},${s.U.bag[d[i][0]]},${tp},${ext})`;
        else sqllog = `INSERT INTO baglog VALUES(NOW(),${s.U.uid},${s.U.gametp},${d[i][0]},${d[i][1]},${s.U.bag[d[i][0]]},${tp},${ext})`;
        rtlist.push([d[i][0], s.U.bag[d[i][0]]]);
    }
    bs.DB.logsql(sqllog);
    if(!callback) bs.send(s, [3, 99, rtlist]);
    game.getitem(s, rtlist);
}

/** 服务器减少道具 */
// module.exports.dec = function(d,s,callback,tp,ext){
//     const bs = require("../module/base");
//     s.U.bag[d[0]] -= d[1];
//     tp = tp || 4;
//     ext = ext || 0;
//     bs.DB.logsql(`INSERT INTO baglog VALUES(NOW(),${s.U.uid},${s.U.gametp},${d[0]},${-d[1]},${s.U.bag[d[0]]},${tp},${ext})`);
//     if(!callback){
//         bs.send(s, [3,99,[[d[0], s.U.bag[d[0]]]]]);
//     }
// }

/** 服务器获得指定道具 */
module.exports.getitem = function(d,s,callback){
    const bs = require("../module/base"), gcf = require("../config/gamelist.json"), bg = require("../config/item" + gcf[s.U.gametp]);
    for(let i=0;i<d.length;i++){
        if(!bg[d[i]] || !bg[d[i]].list){ //道具不存在
            LOG.error("getitem", d[i]);
            continue;
        }
        let item = bg[d[i]], gmp = {}, gtlist = [];
        if(!item.list || item.list.length == 0) continue;
        if(item.list[0] > item.list.length - 1){ //道具配置错误获取的数量小于获得的数量
            LOG.error("getitem num > list", d[i]);
            return;
        }
        let num = 0;
        for(let n=1;n<item.list.length;n++) num += item.list[n][0];

        for(let j=0;j<item.list[0];j++){
            let rd = Math.random() * num | 0, cp = 0;
            for(let n=1;n<item.list.length;n++){
                if(gmp[n] || item.list[n][0] < 1) continue;
                cp += item.list[n][0];
                if(cp > rd){
                    gmp[n] = item.list[n][1];
                    gtlist.push([item.list[n][1],item.list[n][2]]);
                    num -= item.list[n][0];
                    break;
                }
            }
        }
        this.add(gtlist,s,null,1,d[i])
        callback && callback(gtlist);
    }
}


